﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using QUANLIBANHANG.ENTITY;
using QUANLIBANHANG.BUS;
using System.Data.SqlClient;
using System.Security.Cryptography;
using DevExpress.Data;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Columns;

using DevExpress.XtraCharts;

namespace QUANLIBANHANG.GUI
{
    public partial class FormQuanLiBanHang : DevExpress.XtraEditors.XtraForm
    {

        ChitiethdEntity chitiethdEn;
        HoadonEntity hdEn;
        SanphamEntity spEn;
        NhanvienEntity nvEn;
        KhachhangEntity khEn;

        DataTable tableSP;
        DataTable tableNV;

        Fileexcel excel;
        List<string> listnamesp;
        OpenFileDialog openfile;
        OpenFileDialog openexcel;
        public FormQuanLiBanHang()
        {
            
            InitializeComponent();
            chitiethdEn = new ChitiethdEntity();
            hdEn = new HoadonEntity();
            spEn = new SanphamEntity();
            nvEn = new NhanvienEntity();
            khEn = new KhachhangEntity();
            excel = new Fileexcel();
            listnamesp = new List<string>();
            openfile = new OpenFileDialog();
            openexcel = new OpenFileDialog();
        }
        
        private void QUANLIBANHANGGUI_Load(object sender, EventArgs e)
        {
            tableSP = SanphamBUS.getTableSP("");
            tableNV = NhanvienBUS.getTableNV("");
            loadSP();
            loadKH();
            loadKhoHang();
            loadNV();
            LoadHoaDon();
            infoTaiKhoan();
            UserControlInformation usinformation = new UserControlInformation();
            panelDock.Controls.Clear();
            panelDock.Controls.Add(usinformation);
            usinformation.Dock = System.Windows.Forms.DockStyle.Fill;
            
        }

        private void QUANLIBANHANGGUI_FormClosing(object sender, FormClosingEventArgs e)
        {
            DialogResult dlr;
            dlr = MessageBox.Show("Bạn có muốn thoát không?", "Thông báo", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
            if (dlr == DialogResult.OK)
            {
                Application.ExitThread();
                e.Cancel = false;
            }
            else
            {
                e.Cancel = true;
            }

        }

        #region Tài khoản
        formInfoTaiKhoan frmTaiKhoan = new formInfoTaiKhoan();
        // Nhận dử liệu từ form dang nhap
        public void getStr(string str)
        {
            lblMaNV.Text = str;
        }
        // Thực hiện xem, thay đổi thông tin tài khoản
        public void infoTaiKhoan()
        {
            tableNV = NhanvienBUS.getTableNV("");
            DataRow[] row = tableNV.Select("MANV='" + lblMaNV.Text + "'");
            lblTenNV.Text = row[0]["HOTEN"].ToString();
            picTaiKhoan.Image = byteArrayToImage((byte[])row[0]["AVATAR"]);
            lblChucvu.Text="(" +row[0]["CHUCVU"].ToString()+")";
            switch (row[0]["CHUCVU"].ToString())
            {
                case "Kiểm kho":
                    tabpageKhoHang.PageEnabled = true;
                    tabcontrolMain.SelectedTabPage = tabpageKhoHang;
                    break;
                case "Kế toán":
                    tabpageThongKe.PageEnabled = true;
                    tabcontrolMain.SelectedTabPage = tabpageThongKe;
                    break;
                case "Nhân sự":
                    tabpageNhanVien.PageEnabled = true;
                    tabcontrolMain.SelectedTabPage = tabpageNhanVien;
                    break;
                case "Bán hàng":
                    tabpageSanPham.PageEnabled = true;
                    tabpageKhachHang.PageEnabled = true;
                    tabcontrolMain.SelectedTabPage = tabpageSanPham;
                    break;
                case "Kỹ thuật":
                    nbiBackupRestore.Enabled = true;
                    tabcontrolMain.SelectedTabPage = tabpageThongTin;
                    break;
                case "Admin":
                    tabpageNhanVien.PageEnabled = true;
                    tabpageKhoHang.PageEnabled = true;
                    tabpageKhachHang.PageEnabled = true;
                    tabpageSanPham.PageEnabled = true;
                    tabpageThongKe.PageEnabled = true;
                    nbiBackupRestore.Enabled = true;
                    tabcontrolMain.SelectedTabPage = tabpageSanPham;
                    break;
            }


        }
        
        public delegate void sentInfoTK(string sent);
        private void lblMaNV_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            sentInfoTK sent = new sentInfoTK(frmTaiKhoan.receiveMess);
            sent(lblMaNV.Text);
            frmTaiKhoan.ShowDialog();
            loadNV();
            infoTaiKhoan();
           
        }

        // Thực hiện đăng xuất
        private void lblDangxuat_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Application.Restart();
        }
         
        
        #endregion
        
        #region Sản phẩm
        private void loadSP()
        {
            
            cbbMakh.DataSource = KhachHangBUS.getTableKH("");
            cbbMakh.DisplayMember = "MAKH";
            cbbMakh.ValueMember = "MAKH";

            tableSP = SanphamBUS.getTableSP("WHERE SOLUONG NOT LIKE '0'");
            
            
        }
        // Xóa sản phẩm trong hóa đơn.
        private void xoaToolStripMenuSanPham_Click(object sender, EventArgs e)
        {
            _tongthanhtien = 0;
            _tiengiamgia = 0;
            _tienvat = 0;
            _tienthanhtoan = 0;

           
                int row = dgvHoadon.CurrentCell.RowIndex;
                dgvHoadon.Rows.RemoveAt(row);
               
                
                for (int i = 0; i < dgvHoadon.Rows.Count; ++i)
                {
                    spEn.Gia = double.Parse(dgvHoadon.Rows[i].Cells[5].Value.ToString());
                    spEn.Soluong = int.Parse(dgvHoadon.Rows[i].Cells[4].Value.ToString());
                    spEn.Ptgiamgia = int.Parse(dgvHoadon.Rows[i].Cells[7].Value.ToString());
                    spEn.Ptvat = int.Parse(dgvHoadon.Rows[i].Cells[8].Value.ToString());

                    List<double> tien = SanphamBUS.calculationThanhtien(spEn.Gia, spEn.Soluong, spEn.Ptgiamgia, spEn.Ptvat);


                    _tongthanhtien += tien[0];
                    _tiengiamgia += tien[1];
                    _tienvat += tien[2];
                    _tienthanhtoan += tien[3];

                }
                lblThanhTien.Text = _tongthanhtien.ToString("###,### VNĐ");
                lblTienGiamGia.Text = _tiengiamgia.ToString("###,### VNĐ");
                lblTienVAT.Text = _tienvat.ToString("###,### vnđ");
                lblTienThanhToan.Text = _tienthanhtoan.ToString("###,### VNĐ");
                lbxDanhsachSP.SelectedIndex = (lbxDanhsachSP.Items.Count - 1) - lbxDanhsachSP.SelectedIndex;
           

        }
        // Thực hiện khi chọn mặt hàng(Điện thoại, laptop)        
        private void navBarMatHang_LinkClicked(object sender, DevExpress.XtraNavBar.NavBarLinkEventArgs e)
        {
            lbxDanhsachSP.DisplayMember = "TENSP";
            lbxDanhsachSP.ValueMember = "MASP";
            lbxDanhsachSP.DataSource =SanphamBUS.getTableSP("WHERE HANGSX='" + e.Link.Caption.ToString()+"' AND LOAISP=N'"+e.Link.Group.Caption.ToString()+"' AND SOLUONG NOT LIKE '0'" );

           
        }
        // Tìm kiếm sản phẩm
        private void txtTimkiem_TextChanged(object sender, EventArgs e)
        {
            DataTable dt =SanphamBUS.getTableSP("");
            dt.Clear();
            lbxDanhsachSP.DataSource = null;
            foreach (DataRow item in tableSP.Rows)
            {
                
                if (item["TENSP"].ToString().Contains(txtTimkiem.Text.ToUpper()))
                {
                    dt.ImportRow(item);
 
                }
                

            }
            lbxDanhsachSP.DisplayMember = "TENSP";
            lbxDanhsachSP.ValueMember = "MASP";
            lbxDanhsachSP.DataSource = dt;  
               
           
        }
        // Thực hiện khi click vào sản phẩ trên listbox
        private void lbxDanhsachSP_SelectedValueChanged(object sender, EventArgs e)
        {
            
            if (lbxDanhsachSP.SelectedValue != null && lbxDanhsachSP.DataSource!=null)
            {
               DataRow []row= tableSP.Select("MASP='"+ lbxDanhsachSP.SelectedValue.ToString()+"'");
               lblMasp.Text = row[0]["MASP"].ToString();
               lblTen.Text = row[0]["TENSP"].ToString();
               lblHangsx.Text = row[0]["HANGSX"].ToString();
               lblGia.Text = row[0]["GIA"].ToString();
               lblLoaisp.Text = row[0]["LOAISP"].ToString();
               lblDvtinh.Text = row[0]["DVTINH"].ToString();
               int  soluong = int.Parse(row[0]["SOLUONG"].ToString());
               cbbSoluong.Items.Clear();
                for (int i = 1; i <= soluong; i++)
                {
                    cbbSoluong.Items.Add(i);
                }
                cbbSoluong.SelectedIndex = 0;
                spEn.Hinhanh = (byte[])row[0]["HINHANH"];
                picHinhanhSP.Image = byteArrayToImage(spEn.Hinhanh);
            }
        }

        private void txtTimkiem_Click(object sender, EventArgs e)
        {
            if (txtTimkiem.Text == "Tìm kiếm")
            {
                txtTimkiem.Text = "";
            }
        }


        double _tongthanhtien = 0;
        double _tiengiamgia = 0;
        double _tienvat = 0;
        double _tienthanhtoan = 0;

        private static DataTable getDataTable()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("STT", typeof(int));
            dt.Columns.Add("TENSP", typeof(string));
            dt.Columns.Add("DVT", typeof(string));
            dt.Columns.Add("SL", typeof(int));
            dt.Columns.Add("DONGIA", typeof(double));
            dt.Columns.Add("THANHTIEN", typeof(double));
            return dt;
        }
        int _stt = 0;
        DataTable _dt = getDataTable();
        
        // Thực hiện việc mua hàng
        private void btnMuahang_Click(object sender, EventArgs e)
        {
            
            if (lbxDanhsachSP.SelectedItem != null)
            {
                spEn.Tensp = lblTen.Text;
                spEn.Masp = lblMasp.Text;
                spEn.Hangsx = lblHangsx.Text;
                spEn.Soluong = cbbSoluong.SelectedIndex + 1;
                spEn.Gia = double.Parse(lblGia.Text);
                spEn.Dvtinh = lblDvtinh.Text;
                spEn.Ptgiamgia=int.Parse(txtGiamgia.Text);
                spEn.Ptvat= int.Parse(txtVAT.Text);
                
                lbxDanhsachSP.SelectedIndex = lbxDanhsachSP.Items.Count - 1 - lbxDanhsachSP.SelectedIndex;//chọn vụ trí khác vị trí ban đầu
                
                // Tính toán
                List<double> tien = SanphamBUS.calculationThanhtien(spEn.Gia, spEn.Soluong, spEn.Ptgiamgia, spEn.Ptvat);


                _tongthanhtien += tien[0];
                _tiengiamgia += tien[1];
                _tienvat += tien[2];
                _tienthanhtoan += tien[3];

                lblThanhTien.Text = _tongthanhtien.ToString("###,### VNĐ");
                lblTienGiamGia.Text = _tiengiamgia.ToString("###,### VNĐ");
                lblTienVAT.Text = _tienvat.ToString("###,### VNĐ");
                lblTienThanhToan.Text = _tienthanhtoan.ToString("###,### VNĐ");

                int check = checkInHoaDon(spEn.Masp);// kiểm tra nếu đã có trong hóa đơn hay không
                if (check != -1)
                {

                    int sl = int.Parse(dgvHoadon.Rows[check].Cells[4].Value.ToString());
                    int monye = int.Parse(dgvHoadon.Rows[check].Cells[6].Value.ToString());
                    dgvHoadon.Rows.RemoveAt(check);
                    dgvHoadon.Rows.Insert(check,check, spEn.Masp, spEn.Tensp, spEn.Dvtinh, spEn.Soluong + sl, spEn.Gia, tien[0] + monye, spEn.Ptgiamgia, spEn.Ptvat);
                }
                else// Ngược lại thì thêm vào datalistview
                {
                    dgvHoadon.Rows.Add(_stt, spEn.Masp, spEn.Tensp, spEn.Dvtinh, spEn.Soluong, spEn.Gia, tien[0], spEn.Ptgiamgia, spEn.Ptvat);
                    _stt++;
                }
                cbbMakh.Enabled = false;
            }
            else
            {
                MessageBox.Show("Chưa chọn sản phẩm", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            
        }
        // Kiểm tra xem sản phẩm đã được mua chưa
        public int checkInHoaDon(string maSP)
        {
           
            {
                for (int i = 0; i < dgvHoadon.Rows.Count ; i++)
                {
                    
                    if (maSP == dgvHoadon.Rows[i].Cells[1].Value.ToString())
                    {
                        
                        return i;
                        break;
                    }

                }
            }
            return -1;
 
        }
        // In hóa đơn
        private void btnInHoaDon_Click(object sender, EventArgs e)
        {
            _stt = 0;
            cbbMakh.Enabled = true;
            
            hdEn.Ngayhd=DateTime.Today.ToString("MM-dd-yyyy");
            hdEn.Manv= lblMaNV.Text;
            hdEn.Makh=cbbMakh.Text;
            hdEn.Trigia=_tienthanhtoan;
            HoadonBUS.insertHD(hdEn);
            string tensp;
            string dvtinh;
            string gia;
            string money;
            for (int i = 0; i < dgvHoadon.Rows.Count ; ++i)
            {
                int row = HoadonBUS.getTableHD("").Rows.Count - 1;
                chitiethdEn.Sohd = int.Parse(HoadonBUS.getTableHD("").Rows[row][0].ToString());
                chitiethdEn.Masp = dgvHoadon.Rows[i].Cells[1].Value.ToString();
                chitiethdEn.Soluong = int.Parse(dgvHoadon.Rows[i].Cells[4].Value.ToString());
                ChitiethdBUS.insertChitietHD(chitiethdEn);

                 tensp = dgvHoadon.Rows[i].Cells[2].Value.ToString();
                 dvtinh = dgvHoadon.Rows[i].Cells[3].Value.ToString();
                 gia = dgvHoadon.Rows[i].Cells[4].Value.ToString();
                 money = dgvHoadon.Rows[i].Cells[5].Value.ToString();
                _dt.Rows.Add(i, tensp, dvtinh, chitiethdEn.Soluong, spEn.Gia, money);


            }
           
            dgvHoadon.Rows.Clear();
            loadKhoHang();
            loadSP();

            // Dùng để in vào bên trong file word
            Dictionary<string, string> dict = new Dictionary<string, string>();
            dict.Add("NgayHD", hdEn.Ngayhd);
            dict.Add("SoHD", chitiethdEn.Sohd.ToString());
            dict.Add("TenNV", lblTenNV.Text);
            dict.Add("HotenKH", KhachHangBUS.getTableKH("WHERE MAKH='" + hdEn.Makh + "'").Rows[0]["HOTEN"].ToString());
            dict.Add("SdtKH", KhachHangBUS.getTableKH("WHERE MAKH='" + hdEn.Makh + "'").Rows[0]["SDT"].ToString());
            dict.Add("DiachiKH", KhachHangBUS.getTableKH("WHERE MAKH='" + hdEn.Makh + "'").Rows[0]["DIACHI"].ToString());
            dict.Add("Congtienhang",lblThanhTien.Text);
            dict.Add("Ptramgiamgia",txtGiamgia.Text);
            dict.Add("Tiengiamgia",lblTienGiamGia.Text);
            dict.Add("Vat",txtVAT.Text);
            dict.Add("TienVAT",lblTienVAT.Text);
            dict.Add("Tongthanhtoan",lblTienThanhToan.Text);
            string doctien=Convert.ToString((int)(_tienthanhtoan/1000));
            dict.Add("Tienbangchu",docSoTien(doctien));

            WordUltil word  = new WordUltil(Application.StartupPath+@"\Hoa_Don.dotx",true);
            word.writeFields(dict);
            word.writeTable(_dt, 1);
            //Load lại trạng thái ban đầu
            _dt = getDataTable();
            loadKhoHang();
            loadSP();
            LoadHoaDon();
            loadKH();

            _tongthanhtien = 0;
            _tiengiamgia = 0;
            _tienvat = 0;
            _tienthanhtoan = 0;
            lblThanhTien.Text = _tongthanhtien.ToString("###,### VNĐ");
            lblTienGiamGia.Text = _tiengiamgia.ToString("###,### VNĐ");
            lblTienVAT.Text = _tienvat.ToString("###,### VNĐ");
            lblTienThanhToan.Text = _tienthanhtoan.ToString("###,### VNĐ");

        }

        // Chỉ cho nhập số vào textbox giảm giá
        private void txtGiamgia_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
            {
                e.Handled = true;
            }
        }
        // Chỉ cho nhập số vào textbox VAT
        private void txtVAT_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
            {
                e.Handled = true;
            }
        }
        #endregion
        
        #region Kho Hàng
        
        private void loadKhoHang()
        {
            gridControlKhoHang.DataSource = SanphamBUS.getTableSP("");
            lbxThongBaoKhohang.Items.Clear();
            for (int i = 0; i < SanphamBUS.getTableSP("").Rows.Count; i++)
            {
                if (SanphamBUS.getTableSP("").Rows[i]["SOLUONG"].ToString() == "0")
                    
                    lbxThongBaoKhohang.Items.Add(SanphamBUS.getTableSP("").Rows[i]["MASP"].ToString()+": hết hàng");// hiện thông báo
                
            }

            
        }
        // Thêm sản phẩm vào kho hàng
        private void btnThemSP_Click(object sender, EventArgs e)
        {
            
            if(txtSoluong.Text=="")
            {
                MessageBox.Show("Chưa nhập số lượng", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            if (txtTensp.Text == "")
            {
                MessageBox.Show("Chưa nhập tên sản phẩm", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            if (txtGia.Text=="")
            {
                MessageBox.Show("Chưa nhập giá", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            
           
            
            
            try
            {
                spEn.Tensp = txtTensp.Text;
                spEn.Nuocsx = txtNuocsx.Text;
                spEn.Gia = double.Parse(txtGia.Text);
                spEn.Hinhanh = imageToByteArray(picboxHinhanh.Image);
                spEn.Hangsx = cbbHangsx.SelectedItem.ToString();
                spEn.Loaisp = cbbLoaisp.SelectedItem.ToString();
                spEn.Soluong = int.Parse(txtSoluong.Text);
                spEn.Dvtinh = cbbDvtinh.Text;

                SanphamBUS.insertSP(spEn);
                MessageBox.Show("Thêm thành công","Thành công",MessageBoxButtons.OK,MessageBoxIcon.Information);
                loadKhoHang();
                loadSP();

            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message,"Lỗi",MessageBoxButtons.OK,MessageBoxIcon.Error);
            }
            
        }
        // Thay đổi hình ảnh của sản phẩm
        private void labelChangeHinhanh_Click(object sender, EventArgs e)
        {
            openfile.RestoreDirectory = true;
            openfile.FilterIndex = 1;
            openfile.Filter = "Jpg(*.jpg)|*.jpg|Jpeg(*.jpeg)|*.jpeg|All file(*.*)|*.*";
            if (openfile.ShowDialog() == DialogResult.OK)
            {
                picboxHinhanh.ImageLocation = openfile.FileName;
            }
        }
       // Chỉ chó nhập số 
        private void txtSoluong_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
            {
                e.Handled = true;
            }
        }
        // Chỉ cho nhập só ở textbox giá
        private void txtGia_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
            {
                e.Handled = true;
            }
        }
        // Xóa sản phẩm trong kho hàng
        private void xoaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            spEn.Masp = lblMaspKhohang.Text;
            try
            {
                SanphamBUS.deleteSP(spEn);
                loadKhoHang();
                loadSP();
            }
            catch (SqlException ex)
            {
                if(ex.Number==547)
                 MessageBox.Show("Sản phẩm đã thực hiện mua hàng bên hóa đơn\nKhông thể xóa. Liên hệ admin để thực hiện thao tác","Lỗi",MessageBoxButtons.OK,MessageBoxIcon.Error);
            }
            
         
            
        }
        // Khi click lên lưới 
        private void grvKhoHang_Click(object sender, EventArgs e)
        {
            lblMaspKhohang.Text = grvKhoHang.GetFocusedRowCellDisplayText(grcMasp);
            txtTensp.Text = grvKhoHang.GetFocusedRowCellDisplayText(grcTensp);
            cbbDvtinh.Text = grvKhoHang.GetFocusedRowCellDisplayText(grcDVT);
            cbbHangsx.Text = grvKhoHang.GetFocusedRowCellDisplayText(grcHangsx);
            picboxHinhanh.Image = byteArrayToImage((byte[])grvKhoHang.GetFocusedRowCellValue(grcHinhAnh));
            txtGia.Text = grvKhoHang.GetFocusedRowCellDisplayText(grcGia);
            txtSoluong.Text = grvKhoHang.GetFocusedRowCellDisplayText(grcSoluong);
            txtNuocsx.Text = grvKhoHang.GetFocusedRowCellDisplayText(grcNuocsx);
            cbbLoaisp.Text = grvKhoHang.GetFocusedRowCellDisplayText(grcLoaisp);


        }
        // Thực hiện thêm sản phâm trong file excel
        private void btnThemSPExcel_Click(object sender, EventArgs e)
        {
            openexcel.RestoreDirectory = true;
            openexcel.FilterIndex = 1;
            openexcel.Filter = "File excel(*.xlsx)|*.xlsx";
            if (openexcel.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    DataTable exceltable = excel.getTableExcel(openexcel.FileName, "SELECT * FROM [Sheet1$]");

                    for (int i = 0; i < exceltable.Rows.Count; i++)
                    {
                        spEn.Tensp = exceltable.Rows[i]["TENSP"].ToString();
                        spEn.Dvtinh = exceltable.Rows[i]["DVTINH"].ToString();
                        spEn.Hangsx = exceltable.Rows[i]["HANGSX"].ToString();
                        spEn.Hinhanh = imageToByteArray(picboxHinhanh.Image);
                        spEn.Gia = double.Parse(exceltable.Rows[i]["GIA"].ToString());
                        spEn.Soluong = int.Parse(exceltable.Rows[i]["SOLUONG"].ToString());
                        spEn.Nuocsx = exceltable.Rows[i]["NUOCSX"].ToString();
                        spEn.Loaisp = exceltable.Rows[i]["lOAISP"].ToString();
                       
                        

                         SanphamBUS.insertSP(spEn);
                         loadKhoHang();
                         loadSP();
                       
                         
                        
                        
                        
                    }
                    MessageBox.Show("Thêm thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                catch
                {
                    MessageBox.Show("Lỗi mở file\nVui lòng mở file để thực hiện thao tác", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
               
                
            }
        }
        // Sửa thông tin sản phẩm trong kho hàng
        private void btnSuaSP_Click(object sender, EventArgs e)
        {
            
            
           
            try
            {
                spEn.Masp = grvKhoHang.GetFocusedRowCellDisplayText(grcMasp);
                spEn.Tensp = txtTensp.Text;
                spEn.Dvtinh = cbbDvtinh.Text;
                spEn.Hangsx = cbbHangsx.Text;
                spEn.Hinhanh = imageToByteArray(picboxHinhanh.Image);
                spEn.Gia = double.Parse(txtGia.Text);
                spEn.Soluong = int.Parse(txtSoluong.Text);
                spEn.Nuocsx = txtNuocsx.Text;
                spEn.Loaisp = cbbLoaisp.Text;
                SanphamBUS.updateSP(spEn);
                loadKhoHang();
                loadSP();
                MessageBox.Show("Update thành công");
            }
           catch (Exception ex)
            {

               MessageBox.Show(ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
               
            }
        }


        #endregion

        #region Khách hàng


        private void loadKH()
        {
            gridControlKhachHang.DataSource = KhachHangBUS.getTableKH("");

        }

        

        private void txtTensp_KeyPress(object sender, KeyPressEventArgs e)
        {
            
        }

        private void txtTensp_EditValueChanged(object sender, EventArgs e)
        {
            
        }
        // Thêm khách hàng bằng file excel
        private void btnAddExcel_Click(object sender, EventArgs e)
        {

            openexcel.RestoreDirectory = true;
            openexcel.FilterIndex = 1;
            openexcel.Filter = "File excel(*.xlsx)|*.xlsx";

            if (openexcel.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    DataTable exceltable = excel.getTableExcel(openexcel.FileName, "SELECT * FROM [Sheet1$]");
                    for (int i = 0; i < exceltable.Rows.Count; i++)
                    {
                        khEn.Hoten = exceltable.Rows[i]["TENKH"].ToString();
                        khEn.Ngaysinh = Convert.ToDateTime(exceltable.Rows[i]["NGSINH"].ToString()).ToString("dd/MM/yyyy");
                        khEn.Sdt = exceltable.Rows[i]["SDT"].ToString();
                        khEn.Ngaydk = Convert.ToDateTime(exceltable.Rows[i]["NGDKI"].ToString()).ToString("dd/MM/yyyy");
                        khEn.Tongmua = double.Parse(exceltable.Rows[i]["TONGMUA"].ToString());
                        khEn.Loaikh = exceltable.Rows[i]["LOAIKH"].ToString();
                        khEn.Diachi = exceltable.Rows[i]["DIACHI"].ToString();

                        try
                        {
                            KhachHangBUS.insertKH(khEn);
                            loadKH();
                            MessageBox.Show("Thêm thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                        catch (Exception ex)
                        {

                            MessageBox.Show(ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }


                    }
                }
                catch
                {
                    MessageBox.Show("Mở file để thực hiện thao tác", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }

                

                
            }
        }

        // Thực hiện công việc thêm và sửa
        private void grdKhachHang_RowUpdated(object sender, DevExpress.XtraGrid.Views.Base.RowObjectEventArgs e)
        {

            khEn.Makh = grdKhachHang.GetFocusedRowCellDisplayText(gclMaKH);
            khEn.Hoten = grdKhachHang.GetFocusedRowCellDisplayText(gclTenKH);
            khEn.Ngaysinh = grdKhachHang.GetFocusedRowCellDisplayText(gclNgaySinhKH);
            khEn.Diachi = grdKhachHang.GetFocusedRowCellDisplayText(gclDiachiKH);
            khEn.Sdt = grdKhachHang.GetFocusedRowCellDisplayText(gclSDTKH);
            khEn.Ngaydk = grdKhachHang.GetFocusedRowCellDisplayText(gclNgayDKKH);

            khEn.Loaikh = grdKhachHang.GetFocusedRowCellDisplayText(gclLoaiKH);
            if (khEn.Makh != "")
            {
                try
                {
                    KhachHangBUS.updateKH(khEn);
                    MessageBox.Show("Cập nhật thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                catch (Exception ex)
                {

                    MessageBox.Show(ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);

                }

            }
            else
            {
                try
                {
                    KhachHangBUS.insertKH(khEn);
                    loadKH();
                    MessageBox.Show("Thêm thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                catch (Exception ex)
                {

                    MessageBox.Show(ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);

                }

            }
        }
        // Xoa khách hàng
        private void grdKhachHang_Click(object sender, EventArgs e)
        {

            if (grdKhachHang.GetFocusedDisplayText() == "Delete")
            {

                khEn.Makh = grdKhachHang.GetFocusedRowCellDisplayText(gclMaKH);
                try
                {
                    KhachHangBUS.deleteKH(khEn);
                    MessageBox.Show("Xóa thành công");
                    loadKH();
                }
                catch (Exception ex)
                {

                    MessageBox.Show(ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }


            }
        }
        // Không cho nhập chữ vào bên trong txtSDT
        private void txtSDTKhachhang_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
            {
                e.Handled = true;
            }
        }


        #endregion

        #region Nhân viên
        private void loadNV()
        {
            gridControlNhanvien.DataSource = NhanvienBUS.getTableNV("");
            
        }
        // Click vào lưới dử liệu nhân viên
        private void grvNhanvVien_Click(object sender, EventArgs e)
        {

            lblManvThongTin.Text = grvNhanVien.GetFocusedRowCellDisplayText(grcMaNV);
            txtHotenNV.Text = grvNhanVien.GetFocusedRowCellDisplayText(grcHotenNV);
            txtDiaChiNV.Text = grvNhanVien.GetFocusedRowCellDisplayText(grcDiachiNV);
            txtSdtNV.Text = grvNhanVien.GetFocusedRowCellDisplayText(grcSDTNV);
            dteNgvlamNV.Text = grvNhanVien.GetFocusedRowCellDisplayText(grcNgayvlNV);
            dteNgaysinhNV.Text = grvNhanVien.GetFocusedRowCellDisplayText(grcNgaysinhNV);
            txtEmailNV.Text = grvNhanVien.GetFocusedRowCellDisplayText(grcEmailNV);
            picAvatarNV.Image = byteArrayToImage((byte[])grvNhanVien.GetFocusedRowCellValue(grcAvatar));
            cbbChucvu.Text = grvNhanVien.GetFocusedRowCellDisplayText(grcChucvuNV);
        }
        // Xóa nhân viên
        private void xoaNVToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                
                nvEn.Manv = lblManvThongTin.Text;
                NhanvienBUS.deleteNV(nvEn);
                loadNV();
                MessageBox.Show("Xóa thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }


        }
        // lấy dử liệu trên các control trả về SanphamEntity
        void getDataNV()
        {
            nvEn.Hoten = txtHotenNV.Text;
            nvEn.Ngaysinh = dteNgaysinhNV.DateTime.ToString("MM-dd-yyyy");
            nvEn.Ngayvl = dteNgvlamNV.DateTime.ToString("MM-dd-yyyy");
            nvEn.Sdt = txtSdtNV.Text;
            nvEn.Avatar = imageToByteArray(picAvatarNV.Image);
            nvEn.Diachi = txtDiaChiNV.Text;
            nvEn.Email = txtEmailNV.Text;
            
            nvEn.Chucvu = cbbChucvu.Text;
        }
        // Thêm Nhân viên
        private void btnThemNV_Click(object sender, EventArgs e)
        {
            getDataNV();
            try
            {
                nvEn.Pass = toMD5("123456");
                NhanvienBUS.insertNV(nvEn);
                loadNV();
                MessageBox.Show("Thêm thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);

            }

        }
        // Thay đổi avatar cho nhân viên
        private void lblChangeAvata_Click(object sender, EventArgs e)
        {
            openfile.RestoreDirectory = true;
            openfile.FilterIndex = 1;
            openfile.Filter = "Jpg(*.jpg)|*.jpg";
            if (openfile.ShowDialog() == DialogResult.OK)
            {
                picAvatarNV.ImageLocation = openfile.FileName;
            }
        }
        
        // Sửa nhân viên
        private void btnSuaNV_Click(object sender, EventArgs e)
        {
            getDataNV();

            nvEn.Manv = lblManvThongTin.Text;
            try
            {

                NhanvienBUS.updateNV(nvEn);
                loadNV();
                MessageBox.Show("Sửa thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        // Reset password khi nhân viên quên password mặc định pass:123456
        private void btnResetPassNV_Click(object sender, EventArgs e)
        {

            nvEn.Manv = lblManvThongTin.Text;

            try
            {
                nvEn.Pass = toMD5("123456");
                NhanvienBUS.updatePass(nvEn);
                loadNV();
                MessageBox.Show("Reset password thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);

            }
        }
        // Không cho nhập 2 kí tự @ ở email nhân viên
        private void txtEmailNV_KeyPress(object sender, KeyPressEventArgs e)
        {
            char mailchar = '@';
            if (e.KeyChar == mailchar && txtEmailNV.Text.IndexOf(mailchar.ToString()) != -1)
            {
                e.Handled = true;
            }
        }
        // Không cho nhập chữ ở sdt nhân viên
        private void txtSdtNV_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
                e.Handled = true;
        }

        
        #endregion

        #region Hàm hổ trợ
        // Chuyển image sang dạng byte[]
        public  Image byteArrayToImage(byte[] byteArrayIn)
        {
            MemoryStream ms = new MemoryStream(byteArrayIn);
            Image returnImage = Image.FromStream(ms);
            return returnImage;

        }
        //Chuyển dạng byte[] sang image
        public byte[] imageToByteArray(System.Drawing.Image imageIn)
        {
            MemoryStream ms = new MemoryStream();
            imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
            return ms.ToArray();
        }   
        // Mã hóa mật khẩu MD5
        public static string toMD5(string pass) 
        { 
            MD5CryptoServiceProvider myMD5 = new MD5CryptoServiceProvider(); 
            byte[] myPass = System.Text.Encoding.UTF8.GetBytes(pass);
            myPass = myMD5.ComputeHash(myPass); StringBuilder s = new StringBuilder(); 
            foreach (byte p in myPass)
            { 
                s.Append(p.ToString("x").ToLower());
            } 
            return s.ToString();
        }

        #region Đọc số sang chữ để in lên hóa đơn
        public  string docSo1(int n)
        {
            string s = "";

            switch (n)
            {
                case 0:
                    s = "không";
                    break;
                case 1:
                    s = "một";
                    break;
                case 2:
                    s = "hai";
                    break;
                case 3:
                    s = "ba";
                    break;
                case 4:
                    s = "bốn";
                    break;
                case 5:
                    s = "năm";
                    break;
                case 6:
                    s = "sáu";
                    break;
                case 7:
                    s = "bảy";
                    break;
                case 8:
                    s = "tám";
                    break;
                case 9:
                    s = "chín";
                    break;
            }
            return s;
        } //tiền lẻ

        public string docSo2(int n) //tiền chục
        {
            string strkq = "";
            int n1 = n / 10;
            int n2 = n % 10;
            if (n1 == 1)
                strkq = "mười " + docSo1(n2);
            else if (n2 == 0)
                strkq = docSo1(n1) + " mươi";
            else if (n2 == 1)
                strkq = docSo1(n1) + " mươi mốt";
            else strkq = docSo1(n1) + " mươi " + docSo1(n2);

            return strkq;
        }

        public string docSo3(int n) //tiền trăm
        {
            string strkq = "";
            int n1 = n / 100; //hàng trăm
            int n2 = (n % 100) / 10; //hàng chục
            int n3 = n % 10; //hàng dơn vị
            int n23 = n % 100; //hai số hàng chục và đơn vị
            if (n2 == 0)
                strkq = docSo1(n1) + " trăm lẻ " + docSo1(n3);
            else
                strkq = docSo1(n1) + " trăm " + docSo2(n23);

            return strkq;
        }

        public string docSo4(int n) //tiền triệu
        {
            string strkq = "";
            int n1 = n / 1000; //hàng ngàn
            int n2 = (n % 1000) / 100; //hàng trăm
            int n3 = (n % 100) / 10; //hàng chục
            int n4 = n % 10; //hàng dơn vị
            int n34 = n % 100; //hai số hàng chục và đơn vị
            int n234 = n % 1000; //ba số hàng trăm, chục và đơn vị
            if ((n % 1000) == 0)
                strkq = docSo1(n1) + " triệu";
            else if ((n2 == 0) && (n3 == 0))
                strkq = docSo1(n1) + " triệu không trăm lẻ " + docSo1(n4) + " ngàn";
            else if ((n2 == 0) && (n3 != 0))
                strkq = docSo1(n1) + " triệu không trăm " + docSo2(n34) + " ngàn";
            else
                strkq = docSo1(n1) + " triệu " + docSo3(n234) + " ngàn";

            return strkq;
        }

        public string docSo5(int n) //tiền chục triệu
        {
            string strkq = "";
            int n12 = n / 1000; //hai số chục triệu
            int n3 = (n % 1000) / 100; //hàng trăm
            int n4 = (n % 100) / 10; //hàng chục
            int n5 = n % 10; //hàng đơn vị
            int n45 = n % 100;
            int n345 = n % 1000;
            if ((n % 1000) == 0)
                strkq = docSo2(n12) + " triệu";
            else if ((n3 == 0) && (n4 == 0))
                strkq = docSo2(n12) + " triệu không trăm lẻ " + docSo1(n5) + " ngàn";
            else if ((n3 == 0) && (n4 != 0))
                strkq = docSo2(n12) + " triệu không trăm " + docSo2(n45) + " ngàn";
            else
                strkq = docSo2(n12) + " triệu " + docSo3(n345) + " ngàn";

            return strkq;
        }

        public string docSoTien(string sotien)
        {
            string kq = "";
            int n = int.Parse(sotien);
            if (sotien.Length == 1)
            {
                kq = docSo1(n) + " ngàn đồng";
            }
            else if (sotien.Length == 2)
            {
                kq = docSo2(n) + " ngàn đồng";
            }
            else if (sotien.Length == 3)
            {
                kq = docSo3(n) + " ngàn đồng";
            }
            else if (sotien.Length == 4)
            {
                kq = docSo4(n) + " đồng";
            }
            else if (sotien.Length == 5)
            {
                kq = docSo5(n) + " đồng";
            }
            return kq;
        
        }
        #endregion 

        #endregion

        #region Thống kê
        // Thông kê doanh số
        private void btnThongKeDT_Click(object sender, EventArgs e)
        {
            
            string startdate = dtpBatdau.Value.ToString("yyyy-MM-dd");
            string enddate = dtpKetthuc.Value.ToString("yyyy-MM-dd");

            gridControlDoanhthu.DataSource = HoadonBUS.getTableHDDoanhThu(startdate, enddate);
            // Thực hiện việc vẻ biểu đồ
            chartControlBanHang.Series.Clear();

            Series s = new Series
            {
                DataSource = HoadonBUS.getTableHDDoanhThu(startdate,enddate),
                ArgumentScaleType = ScaleType.Auto,
                ArgumentDataMember = "NGAYHD",
                ValueScaleType = ScaleType.Numerical,

            };
            s.ValueDataMembers.AddRange(new string[] { "TRIGIA" });
            chartControlBanHang.Series.Add(s);
        }

        private void LoadHoaDon()
        {
            gridControlDoanhthu.DataSource = HoadonBUS.getTableHD("");

            gdcThongKeKH.DataSource = KhachHangBUS.getTopKH();

            gridControlThongKeSP.DataSource = ChitiethdBUS.getTopSp();

            chartControlBanHang.Series.Clear();
            Series s = new Series
            {
                DataSource = HoadonBUS.getTableHD(""),
                ArgumentScaleType = ScaleType.Auto,
                ArgumentDataMember = "NGAYHD",
                ValueScaleType = ScaleType.Numerical,
                


            };
            s.ValueDataMembers.AddRange(new string[] { "TRIGIA" });
            chartControlBanHang.Series.Add(s);

            
        }

        private void btnAllHD_Click(object sender, EventArgs e)
        {
            LoadHoaDon();
        }
        // In ra doanh số của công ty
        private void btnPrintDT_Click(object sender, EventArgs e)
        {
            gridControlDoanhthu.ShowPrintPreview();
        }
        // in ra 10 sản phẩm bán chạy nhất
        private void btnPrintSP_Click(object sender, EventArgs e)
        {
            gridControlThongKeSP.ShowPrintPreview();
        }
        // In ra 10 khách hàng mua hàng nhiều nhất
        private void btnPrintKH_Click(object sender, EventArgs e)
        {
            gdcThongKeKH.ShowPrintPreview();
        }
        #endregion

        #region Thông tin, cài đặt
        // Backup và Restore
        private void nbiBackupRestore_LinkClicked(object sender, DevExpress.XtraNavBar.NavBarLinkEventArgs e)
        {
            UserControlBackupRestore usBackupRestore = new UserControlBackupRestore();
            panelDock.Controls.Clear();
            panelDock.Controls.Add(usBackupRestore);
            usBackupRestore.Dock = System.Windows.Forms.DockStyle.Fill;
        }
        // Hướng dẫn sử dụng
        private void navBarItem10_LinkClicked(object sender, DevExpress.XtraNavBar.NavBarLinkEventArgs e)
        {
            UserControlGuideAndUse usGuideAndUse = new UserControlGuideAndUse();
            panelDock.Controls.Clear();
            panelDock.Controls.Add(usGuideAndUse);
            usGuideAndUse.Dock = System.Windows.Forms.DockStyle.Fill;
        }

       
        // Thông tin phần mềm
        private void navBarItem8_LinkClicked(object sender, DevExpress.XtraNavBar.NavBarLinkEventArgs e)
        {
            UserControlInformation usinformation = new UserControlInformation();
            panelDock.Controls.Clear();
            panelDock.Controls.Add(usinformation);
            usinformation.Dock = System.Windows.Forms.DockStyle.Fill;
        }
        //Thông tin góp ý
        private void navBarItem11_LinkClicked(object sender, DevExpress.XtraNavBar.NavBarLinkEventArgs e)
        {

            usControlRespond usRes = new usControlRespond();
            panelDock.Controls.Clear();
            panelDock.Controls.Add(usRes);
            usRes.Dock = System.Windows.Forms.DockStyle.Fill;
        }
        #endregion

        

        


        

       

       
    }
}
